package main

import (
	"fmt"
	"strconv"
	"unsafe"
)

/*
整形的类型
类型		符号		占用存储空间		表示范围
int8	有		1字节			-128~ 127
int16	有		2字节			-2^15~ 2^15-1
int32	有		4字节			-2^31~ 2^31-1
int64	有		8字节			-2^63~ 2^63-1
------------
uint8	无		1字节			0~ 255
uint16	无		2字节			0~ 2^16-1
uint32	无		4字节			0~ 2^32-1
uint64	无		8字节			0~ 2^64-1
------------
int 	有		32系统 4字节		-2^31~ 2^31-1
				64系统 48字节		-2^63~ 2^63-1
uint 	无		32系统 4字节		0~ 2^32-1
				64系统 48字节		0~ 2^64-1
rune	有		与int32等价		-2^31~ 2^31-1 （表示一个Unicode码）
byte	无		与uint8等价		0~ 255（当要存储字符时选用byte）
*/

func main(){
	var n1 = 100 // 整形默认声明为 int型
	fmt.Printf("n1 的类型 %T ; 占用的字节数 %d \n", n1, unsafe.Sizeof(n1))

	var n2 int64 = 10
	fmt.Printf("n2 的类型 %T ; 占用的字节数 %d \n", n2, unsafe.Sizeof(n2))

	// Go在不同类型的变量之间赋值时需要显示转换，也就是说Golang中的数值类型不能自行转换
	// T: 就是数据类型 ，例如 int32 int64
	// v:就是需要转换的变量
	var i1 int32 = 100
	var f1 float32 = float32(i1);
	var i2 int8 = int8(i1)
	var i3 int64 = int64(i1)
	fmt.Printf("i2 = %v, f1 = %v, i3 = %v \n", i2, f1, i3)

	// 数值类型 to string
	str := fmt.Sprintf("%d", i1);
	fmt.Printf("str type is %T, str = %q \n", str, str);

	var f2 float64 = 23.43433
	str = strconv.FormatFloat(f2, 'f', 10, 64)
	fmt.Printf("str type is %T, str = %q \n", str, str);

	// string to 基本数据类型
	parseBool, _ := strconv.ParseBool("true")
	fmt.Printf("parseBool type %T, parseBool = %v \n", parseBool, parseBool)

	//parseInt, _ := strconv.ParseInt("1234340", 10, 64)
	parseInt, _ := strconv.ParseInt("224", 10, 32)
	fmt.Printf("parseInt type %T, parseInt = %v \n", parseInt, parseInt)

	fmt.Println("parseInf的地址 = ", &parseInt)

	var ptr *int64 = &parseInt
	fmt.Printf("prt = %v , ptr的地址 = %v, prt 指向的值 = %v \n", ptr, &ptr, *ptr);

}